package cn.kinoko.service.manga;

import cn.kinoko.common.base.model.BaseQuery;
import cn.kinoko.common.model.KV;
import cn.kinoko.model.cnTeam.vo.MemberVO;
import cn.kinoko.model.manga.entity.Manga;
import cn.kinoko.model.manga.query.MangaQuery;
import cn.kinoko.model.manga.req.*;
import cn.kinoko.model.manga.vo.*;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * @author xxx
 */
public interface MangaService extends IService<Manga> {

    /**
     * 保存漫画
     *
     * @param req 请求参数
     * @return 执行结果
     */
    boolean saveManga(MangaReq req);

    /**
     * 更新漫画
     *
     * @param req 请求参数
     * @return 执行结果
     */
    boolean updateManga(MangaReq req);

    /**
     * 设置漫画是否展示
     *
     * @param mangaId     漫画id
     * @param isAvailable 是否可用
     * @return 执行结果
     */
    boolean available(Long mangaId, Boolean isAvailable);

    /**
     * 删除漫画
     *
     * @param mangaId 漫画id
     * @return 执行结果
     */
    boolean deleted(Long mangaId);

    /**
     * 分页查询
     *
     * @param query 查询参数
     * @return 分页结果
     */
    Page<MangaVO> homePage(BaseQuery query);

    /**
     * 获取我参与的漫画列表
     *
     * @param query 查询参数
     * @return 漫画列表
     */
    Page<MangaVO> mineMange(MangaQuery query);

    /**
     * 获取热度前10的漫画
     *
     * @param cycle 周期 1 年 2 月 3 周
     * @return 漫画列表
     */
    List<MangaVO> top10Manga(Integer cycle);

    /**
     * 获取更新频率前10的漫画
     *
     * @param cycle 周期 1 月 2 周 3 日
     * @return 漫画列表
     */
    List<MangaVO> top10UpdateManga(Integer cycle);

    /**
     * 搜索漫画
     *
     * @param query 查询参数
     * @return 漫画列表
     */
    Page<MangaSearchVO> searchManga(MangaQuery query);

    /**
     * 获取漫画信息
     *
     * @param mangaId 漫画id
     * @return 漫画信息
     */
    MangaInfoVO info(Long mangaId);

    /**
     * 获取漫画的章节列表
     *
     * @param mangaId 漫画id
     * @return 章节列表
     */
    List<MangaEpVO> epList(Long mangaId);

    /**
     * 新增章节
     *
     * @param req 请求参数
     * @return 执行结果
     */
    boolean saveEp(MangaEpReq req);

    /**
     * 更新章节
     *
     * @param req 请求参数
     * @return 执行结果
     */
    boolean epUpdate(MangaEpReq req);

    /**
     * 删除章节
     *
     * @param req 请求参数
     * @return 执行结果
     */
    boolean epDeleted(MangaEpReq req);

    /**
     * 章节排序
     *
     * @param req 排序参数
     * @return 执行结果
     */
    boolean epReSort(MangaEpReSortReq req);

    /**
     * 设置章节是否展示
     *
     * @param req 请求参数
     * @return 执行结果
     */
    boolean epAvailable(MangaEpAvailableReq req);

    /**
     * 获取漫画生肉列表
     *
     * @param epId 章节id
     * @return 生肉列表
     */
    List<MangaEpRawVO> rawList(Long epId);

    /**
     * 获取漫画熟肉列表
     *
     * @param epId 章节id
     * @return 熟肉列表
     */
    List<MangaEpCookedVO> cookedList(Long epId);

    /**
     * 上传漫画生肉
     *
     * @param epId  章节id
     * @param files 文件
     * @return 执行结果
     */
    boolean uploadRawMg(Long epId, MultipartFile[] files) throws InterruptedException;

    /**
     * 重传生肉
     *
     * @param epId   章节id
     * @param pageId 页码id
     * @param file   文件
     * @return 执行结果
     */
    boolean reUploadRawMg(Long epId, Long pageId, MultipartFile file) throws InterruptedException;

    /**
     * 上传漫画熟肉
     *
     * @param epId  章节id
     * @param files 文件
     * @return 执行结果
     */
    boolean uploadCookedMg(Long epId, MultipartFile[] files) throws InterruptedException;

    /**
     * 重传熟肉
     *
     * @param epId   章节id
     * @param pageId 页码id
     * @param file   文件
     * @return 执行结果
     */
    boolean reUploadCookedMg(Long epId, Long pageId, MultipartFile file) throws InterruptedException;

    /**
     * 删除生肉页码
     *
     * @param epId   章节id
     * @param pageId 页码id
     * @return 执行结果
     */
    boolean deletedRaw(Long epId, Long pageId);

    /**
     * 清空生肉页码
     * @param epId 章节id
     * @return 执行结果
     */
    boolean clearRaw(Long epId);

    /**
     * 删除熟肉页码
     *
     * @param epId   章节id
     * @param pageId 页码id
     * @return 执行结果
     */
    boolean deletedCooked(Long epId, Long pageId);

    /**
     * 清空熟肉页码
     *
     * @param epId 章节id
     * @return 执行结果
     */
    boolean clearCooked(Long epId);

    /**
     * 重新排序生肉页码
     *
     * @param req 请求参数
     * @return 执行结果
     */
    boolean reSortRawList(MangaPageReSortReq req);

    /**
     * 重新排序熟肉页码
     *
     * @param req 请求参数
     * @return 执行结果
     */
    boolean reSortCookedList(MangaPageReSortReq req);

    /**
     * 保存标注
     *
     * @param req 请求参数
     * @return 执行结果
     */
    boolean saveMark(MarkReq req);

    /**
     * 获取标注列表
     *
     * @param epRid 章节生肉id
     * @return 标注列表
     */
    List<MarkVO> markList(Long epRid);

    /**
     * 根据汉化组id热度前5的漫画
     *
     * @param tId 汉化组id
     * @return 热度前5的漫画
     */
    List<MangaCoverVO> queryTop5MangaByTid(Long tId);

    /**
     * 漫画成员列表
     *
     * @param mangaId 漫画id
     * @return 成员列表
     */
    List<MemberVO> mangaMember(Long mangaId);

    /**
     * 漫画成员列表
     *
     * @param epId 章节id
     * @return 成员列表
     */
    List<MemberVO> mangaMemberByEpId(Long epId);

    /**
     * 漫画成员职位列表
     *
     * @return 职位列表
     */
    List<KV<Long, String>> positionList();

    /**
     * 漫画成员职位变更
     *
     * @param req 请求参数
     * @return 执行结果
     */
    boolean changePosition(MangaMemberPositionReq req);

    /**
     * 添加漫画成员
     *
     * @param req 请求参数
     * @return 执行结果
     */
    boolean appendMember(AppendMemberReq req);

    /**
     * 移除漫画成员
     *
     * @param mangaId 漫画id
     * @param uid     成员id
     * @return 执行结果
     */
    boolean removeMember(Long mangaId, Long uid);

    /**
     * 漫画浏览量+1
     *
     * @param mangaId 漫画id
     * @param request 请求
     * @return 执行结果
     */
    boolean plusView(Long mangaId, HttpServletRequest request);

    /**
     * 漫画点赞
     *
     * @param mangaId 漫画id
     * @param isLike  是否点赞 true 点赞 false 取消点赞
     * @return 执行结果
     */
    boolean like(Long mangaId, Boolean isLike);

    /**
     * 漫画点赞数量
     *
     * @param mangaId 漫画id
     * @return 执行结果
     */
    LikeCountVO likeCount(Long mangaId);

    /**
     * 漫画热度计算
     */
    void computeMangaHeat();

    /**
     * 漫画标注留言
     *
     * @param req 请求参数
     * @return 执行结果
     */
    boolean comment(MarkCommentReq req);

    /**
     * 漫画标注留言撤销
     *
     * @param id 标注留言id
     * @return 执行结果
     */
    boolean undoComment(Long id);

    /**
     * 漫画标注留言查询
     *
     * @param markId 标注id
     * @return 执行结果
     */
    List<MarkCommentVO> queryComment(Long markId);

    /**
     * 漫画导出
     *
     * @param params 请求参数
     */
    boolean export(MangaExportReq params);

    /**
     * 漫画导出文本
     *
     * @param epId       章节id
     * @param response   响应
     */
    void exportText(Long epId, HttpServletResponse response);
}